package AccionesSemanticas;
import Elementos.Identificador;
import Elementos.Mensaje;
import Elementos.Token;
import Lexico.AnalizadorLexico;
import Lexico.EntradaTS;

//Procesa una ID, se fija si esta en palabras reservadas, sino lo agrega en la tabla de simbolos
public class AccS1 extends AccionSemantica {

	public AccS1(AnalizadorLexico al) {
		super(al);
	}

	@Override
	public int ejecutar(String actual, String leido) {
		Token devolver= new Token(new Integer(0));
		int esreservada= this.aLexico.getPalabrasReservadas().existePalabraID(actual);
		if(esreservada!=0){                                            									//es palabra reservada
			switch (actual){
				case "if": devolver= new Token("if", esreservada, Token.IF); break;
				case "then": devolver= new Token("then", esreservada, Token.THEN); break;
				case "else": devolver= new Token("else", esreservada, Token.ELSE); break;
				case "begin": devolver= new Token("begin", esreservada, Token.BEGIN); break;
				case "end": devolver= new Token("end", esreservada,Token.END); break;
				case "print": devolver= new Token("print", esreservada, Token.PRINT); break;
				case "function": devolver= new Token("function", esreservada, Token.FUNCTION); break;
				case "return": devolver= new Token("return", esreservada, Token.RETURN); break;				
				case "double": devolver= new Token("double", esreservada, Token.DOUBLE); break;
				case "import": devolver= new Token("import", esreservada, Token.IMPORT); break;
				case "from": devolver= new Token("from", esreservada, Token.FROM); break;
				case "to": devolver= new Token("to", esreservada, Token.TO); break;
				case "do": devolver= new Token("do", esreservada, Token.DO); break;
			}
			this.aLexico.setTokenActual(devolver);
		}
		else{                                                                                     		//No es reservada
			Identificador nuevo= new Identificador(actual);
			if (!nuevo.estaEnRango()){
				Mensaje m= new Mensaje(Mensaje.ADVERTENCIA, "Identificador supero el maximo permitido. Fue truncado a:"+nuevo.getNombre(), this.aLexico.getLineaActual());
				this.aLexico.addMensaje(m);
			}
			EntradaTS enuevo= new EntradaTS(nuevo, this.aLexico.getLineaActual(), "identificador");
			int pos= this.aLexico.getTablaSimbolos().existeSimboloID(enuevo);
			if (pos==0){                                                                               	//no existe
				pos= this.aLexico.getTablaSimbolos().insertSimbolo(enuevo);
				devolver= new Token("id", pos, Token.IDENTIFICADOR);				
			}
			else																						//devuelve el que esta en tabla
				devolver= new Token("id", pos, Token.IDENTIFICADOR);
			this.aLexico.setTokenActual(devolver);
				
		}		
		return -1;
	}

}
